package main

import (
	"io/ioutil"
	"os"
	"path"
	"regexp"
	"strings"

	"github.com/pkg/errors"
)

// 接口源目录
const (
	srcPath     = "../SOPTv3.6.2_20210915/"
	packageName = "gitee.com/haifengat/gosopt"
)

var GOLOBAL_FunDefs = make([]*funcDefine, 0)

type funcDefine struct {
	FuncName              string
	FuncParams            string
	FuncParamsFirstType   string
	FuncParamsFirstValue  string
	FuncParamsOtherValues string
	FuncRemart            string
}

type apiConfig struct {
	FolderName, FileName, ApiName, LibName string
}

// splitSrc 原c+文件拆解
func splitSrc(quote bool) error {
	var h_fileName string // api.h 文件
	if quote {
		h_fileName = "ThostFtdcMdApi.h"
	} else {
		h_fileName = "ThostFtdcTraderApi.h"
	}
	// TODO 读文件 MdApi.h
	f, err := os.Open(path.Join(srcPath, h_fileName))
	if err != nil {
		return errors.Wrap(err, "open file")
	}
	bs, _ := ioutil.ReadAll(f)
	/*
		///心跳超时警告。当长时间未收到报文时，该方法被调用。
		///@param nTimeLapse 距离上次接收报文的时间
		virtual void	 OnHeartBeatWarning(int nTimeLapse){};
	*/
	// TODO 函数分解
	re := regexp.MustCompile(`\t///(.*)\r\n[^v]*virtual \w+ (\w+)\(([^)]*)\)`) // 分解函数定义:注释,函数名,参数字段
	onFuns := re.FindAllStringSubmatch(string(bs), -1)
	for _, fun := range onFuns {
		funcRemark, funcName, funcParams := fun[1], fun[2], fun[3]
		var funcParamsOtherValues, funcParamsFirstType, funcParamsFirstValue string
		// INFO 多参数处理
		if len(funcParams) > 0 {
			fsParams := strings.Split(funcParams, ",") // 所有参数分隔
			for i, v := range fsParams {
				fs := strings.Split(strings.TrimSpace(v), " ") // 注意去掉第2个以后的参数前的空格
				if i == 0 {
					funcParamsFirstType = fs[0]
					funcParamsFirstValue = strings.ReplaceAll(fs[len(fs)-1], "*", "") // 处理 * pXXX 的情况,如 RegisterFensUserInfo
				} else {
					funcParamsOtherValues += strings.ReplaceAll(fs[1], "*", "") + "," // 处理有*的参数值
				}
			}
			funcParamsOtherValues = strings.TrimSuffix(funcParamsOtherValues, ",")
		}
		GOLOBAL_FunDefs = append(GOLOBAL_FunDefs, &funcDefine{
			FuncName:              funcName,
			FuncParams:            funcParams,
			FuncParamsFirstType:   funcParamsFirstType,
			FuncParamsFirstValue:  funcParamsFirstValue, // 尾部没有 ,
			FuncParamsOtherValues: funcParamsOtherValues,
			FuncRemart:            funcRemark,
		})
	}
	return nil
}
